CloudFormation StackSetsを使い、複数のリージョンにスタックをデプロイしてみた
こんにちは、イムチェジョンです。
CloudFormation StackSetsを使いと、簡単にいろんなアカウントやリージョンにCloudFormationのスタックを配布することができます。
なので、今回は実際にCloudFormation StackSetsを使ってまとめてみます。
アジェンダ
- CloudFormation StackSetsとは?
- StackSetsで複数のリージョンにデプロイ
- まとめ
1. CloudFormation StackSetsとは?
- スタックセットを使用すると、AWS CloudFormationテンプレートを使用して複数リージョン、複数のAWSアカウントにスタックを作成
- 各スタックに含まれたすべてのリソースはスタックセットのAWS CloudFormationテンプレートによって定義される
- スタックセットはリージョンリソースです。 1リージョンにスタックセットを作成すると、他のリージョンでそのスタックセットを見たり変更することができません。
2. StackSetsで複数のリージョンにデプロイ
CloudFormation テンプレート
CloudFormation StackSetsを試してみるため、ネットワーク環境を構築するテンプレートを作成します。
AWSTemplateFormatVersion: "2010-09-09" Description: Network of testing StackSets # ------------ # Parameters # ------------ Parameters: Name: Default: "StackSets" Type: String Description: "Stack name" VpcCidr: Type: String AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})' ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x. Description: "VPC CIDR range" # ------------ # Resources # ------------ Resources: vpc: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCidr EnableDnsHostnames: true EnableDnsSupport: true Tags: - Key: Name Value: !Sub ${Name}-vpc # ----- # Internet Gateway # ----- InternetGateway: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Name Value: !Sub ${Name}-igw VPCGatewayAttach: Type: AWS::EC2::VPCGatewayAttachment Properties: InternetGatewayId: !Ref InternetGateway VpcId: !Ref vpc # ----- # Public Subnet # ----- publicSubnet: Type: AWS::EC2::Subnet Properties: AvailabilityZone: !Select [ 0, !GetAZs '' ] CidrBlock: !Select [0, !Cidr [!GetAtt vpc.CidrBlock, 2, 8]] VpcId: !Ref vpc Tags: - Key: Name Value: !Sub ${Name}-public-subnet # ----- # Private Subnet # ----- privateSubnet: Type: AWS::EC2::Subnet Properties: AvailabilityZone: !Select [ 1, !GetAZs '' ] CidrBlock: !Select [10, !Cidr [!GetAtt vpc.CidrBlock, 12, 8]] VpcId: !Ref vpc Tags: - Key: Name Value: !Sub ${Name}-dmz-subnet # ----- # Route table public # ----- PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref vpc Tags: - Key: Name Value: !Sub ${Name}-public-rtb PublicRoute: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PublicRouteTable DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref InternetGateway #---- # Subnet to attach #---- PublicSubnetRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref publicSubnet RouteTableId: !Ref PublicRouteTable
実際にStackSets使用
IAMの下準備
CloudFormation StackSetsを使用するためには2つのIAMロールが必要です。
IAMロールはCloudFormationのテンプレートが作成されているのでCloudFormationで作成します。
- StackSets作成する管理者アカウントのロール名
- AWSCloudFormationStackSetAdministrationRole
- Stackが作成されるアカウントのロール名
- AWSCloudFormationStackSetExecutionRole
AWSCloudFormationStackSetAdministrationRole
AWSTemplateFormatVersion: 2010-09-09 Description: Configure the AWSCloudFormationStackSetAdministrationRole to enable use of AWS CloudFormation StackSets. Resources: AdministrationRole: Type: AWS::IAM::Role Properties: RoleName: AWSCloudFormationStackSetAdministrationRole AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: cloudformation.amazonaws.com Action: - sts:AssumeRole Path: / Policies: - PolicyName: AssumeRole-AWSCloudFormationStackSetExecutionRole PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - sts:AssumeRole Resource: - "arn:*:iam::*:role/AWSCloudFormationStackSetExecutionRole"
AWSCloudFormationStackSetExecutionRole
AWSTemplateFormatVersion: 2010-09-09 Description: Configure the AWSCloudFormationStackSetExecutionRole to enable use of your account as a target account in AWS CloudFormation StackSets. Parameters: AdministratorAccountId: Type: String Description: AWS Account Id of the administrator account (the account in which StackSets will be created). MaxLength: 12 MinLength: 12 Resources: ExecutionRole: Type: AWS::IAM::Role Properties: RoleName: AWSCloudFormationStackSetExecutionRole AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: AWS: - !Ref AdministratorAccountId Action: - sts:AssumeRole Path: / ManagedPolicyArns: - !Sub arn:${AWS::Partition}:iam::aws:policy/AdministratorAccess
StackSets 作成
今回は3つのリージョンを対象にStackSets
を作成してみます。
CloudFormationのページで[StackSets]に入り、新しいStackSets
を作成します。
今回は同じアカウントの複数のリージョンを対象に作成するので、
IAM 管理ロール ARN : AWSCloudFormationStackSetAdministrationRole
IAM 実行ロール名 : AWSCloudFormationStackSetExecutionRole
を指定します。
また、作成したテンプレートファイルのアップロードします。
StackSet 名 : StackSets-vpc
VPCのサイダーも入力します。
VpcCidr : 10.0.0.0/16
スタックセットを追加するアカウントとリージョンを入力、選択します。
成功的にStackSetsが作成されてオペレーションのステータスがRUNNING
になっているのが確認できます。
スタックインスタンスで確認すると、3つのスタックが生成されているのも確認できます。
少し待つと、3つのリージョンでのスタックが作成完了され、オペレーションのステータスもSUCCEEDED
になります。
これでStackSetsの作成完了です。
StackSetsの確認
StackSetsがよく作成されたのを確認してみましょう。
東京リージョンのスタック
ソウルリージョンのスタック
シンガポールリージョンのスタック
スタックもリソースもよく作成できました。